#ifndef _STRING_H_
#define _STRING_H_

#include <iostream>
#include <string>

using namespace std;

class String
{
private:
    char *str;
    int len;

public:
    String() : str(nullptr), len(0) // 构造函数，参数为空
    {
    }
    String(const char *s) // 构造函数，参数为字符串
    {
        len = strlen(s);
        str = new char[len + 1];
        strcpy(str, s);
    }
    
    String(const String &s) // 构造函数，参数为String对象
    {
        len = s.len;
        str = new char[len + 1];
        strcpy(str, s.str);
    }
    //老师的代码？与原来的代码有什么区别？
    String(const String &obj) // 拷贝构造
    {
        //cout << "copy construcor call" << endl;
        len = strlen(obj.buf);
        this->buf = new char[len + 1];
        strcpy(this->buf, obj.buf); // 深拷贝，完全拷贝(数据部分)
    }
    ~String()
    {
        delete[] str; // 释放内存,delete特性：如果str为nullptr只会不执行，不会报错
    }

    operator=(const char *s);      // 重载赋值运算符，参数为字符串
    operator=(const String & s);   // 重载赋值运算符，参数为String对象
    operator==(const String & s);  // 重载等于运算符，参数为String对象
    operator!=(const String & s);  // 重载不等于运算符，参数为String对象
    operator+(const String & s);   // 重载 + 运算符，参数为String对象
    operator+(const char *s);      // 重载 + 运算符，参数为字符串
    operator const char *() const; // 重载 const char*() 运算符，返回字符串指针
}
#endif